로딩 중이에요... 🐣
[코담]
웹개발·실전 프로젝트·AI까지, 파이썬·장고의 모든것을 담아낸 강의와 개발 노트
15 시리얼라이저로 피드데이터출력(DRF vs 일반 뷰 비교) | ✅ 편저: 코담 운영자
15강 - 시리얼라이저로 피드 데이터 출력 (DRF vs 일반 뷰 비교)
데이터 출력 with Serializers✨ 이번 강의 목표
- Django REST Framework(DRF)를 활용해 피드 데이터를 JSON으로 구조화
- DRF 기반 View와 일반 Django 함수형 뷰 비교
- CSRF 토큰 처리 포함한 고급 직렬화 구현
1. Django REST Framework 설치 및 설정
1) 설치
pip install djangorestframework
pip install markdown # Markdown 지원
pip install django-filter # 필터링 기능
2) settings/base.py
설정
THIRD_PARTY_APPS = [
...
"rest_framework",
]
(※ 일반 장고 프로젝트일 경우 INSTALLED_APPS
에 바로 추가)
2. API 폴더 구조 및 URL 설정
posts/
├── api/
│ ├── serializers.py # 직렬화기 정의
│ ├── views.py # APIView, ListAPIView 등
│ ├── urls.py # API URL 등록
posts/api/urls.py
from django.urls import path
from .views import PostListView, PostDetailView
app_name = "posts_api"
urlpatterns = [
path("posts/", PostListView.as_view(), name="posts-list"),
path("posts/<int:pk>/", PostDetailView.as_view(), name="posts-detail"),
]
config/urls.py
등록
path("api/", include(("django_instagram.posts.api.urls", "posts_api"), namespace="posts_api")),
3. DRF 기반 API View - PostListView
posts/api/views.py
from django.shortcuts import get_object_or_404
from rest_framework.response import Response
from rest_framework import status, generics, permissions
from django.db.models import Q
from .serializers import PostSerializer
from django_instagram.users.models import User as user_model
from django_instagram.posts.models import Post
class PostListView(generics.ListAPIView):
serializer_class = PostSerializer
permission_classes = [permissions.IsAuthenticated]
def get_queryset(self):
user = get_object_or_404(user_model, pk=self.request.user.id)
following = user.following.all()
return Post.objects.filter(Q(author__in=following) | Q(author=user))
def list(self, request, *args, **kwargs):
queryset = self.get_queryset()
serializer = self.get_serializer(queryset, many=True, context={'request': request})
return Response({"posts": serializer.data}, status=status.HTTP_200_OK)
4. 일반 Django FBV 방식
posts/views.py
@api_view(['GET'])
def posts_list_view(request):
if request.method == 'GET':
user = get_object_or_404(user_model, pk=request.user.id)
following = user.following.all()
followed_posts = models.Post.objects.filter(Q(author__in=following) | Q(author=user)).order_by('-created_at')
serializer = PostSerializer(followed_posts, many=True, context={'request': request})
login_user_serializer = UserSerializer(request.user, context={'request': request})
return JsonResponse({
"posts": serializer.data,
"loginUser": login_user_serializer.data
}, status=200)
✅ 차이점: DRF는
Response
, FBV는JsonResponse
사용 / View 클래스 방식 vs 함수형 방식
5. 시리얼라이저 구현 (serializers.py)
from rest_framework import serializers
from django_instagram.users.models import User as user_model
from .. import models
from django.middleware.csrf import get_token
class FeedAuthorSerializer(serializers.ModelSerializer):
class Meta:
model = user_model
fields = ("id", "username", "profile_photo")
class CommentSerializer(serializers.ModelSerializer):
author = FeedAuthorSerializer()
class Meta:
model = models.Comment
fields = ("id", "contents", "author")
class PostSerializer(serializers.ModelSerializer):
comment_post = CommentSerializer(many=True) # related_name='comment_post' 필요
author = FeedAuthorSerializer()
csrf_token = serializers.SerializerMethodField()
class Meta:
model = models.Post
fields = (
"id", "image", "caption", "image_likes", "author", "comment_post", "csrf_token"
)
def get_csrf_token(self, obj):
request = self.context.get('request')
return get_token(request) if request else None
6. 템플릿 예시 (posts/main.html
)
{% for post in posts %}
<div class="text-left">
<p>{{ post.author.id }}</p>
<p>{{ post.author.username }}</p>
<p>{{ post.author.profile_photo }}</p>
<p>{{ post.id }}</p>
<p>{{ post.image }}</p>
<p>{{ post.caption }}</p>
<br/>
<strong>댓글 목록</strong>
{% for comment in post.comment_post %}
<p>{{ comment.id }}</p>
<p>{{ comment.contents }}</p>
<p>{{ comment.author.id }}</p>
{% endfor %}
<hr/>
</div>
{% endfor %}
7. CSRF 토큰 관련 처리
- 시리얼라이저 내부에서
SerializerMethodField
로 CSRF 토큰 반환 context={'request': request}
반드시 전달- 미들웨어
CsrfViewMiddleware
활성화 필수
예외 처리용 코드
from django.middleware.csrf import get_token
from django.http import HttpRequest
def get_csrf_token(self, obj):
request = self.context.get('request')
if request and hasattr(request, 'META'):
return get_token(request)
dummy_request = HttpRequest()
return get_token(dummy_request)
✅ DRF vs 일반 Django 뷰 비교 요약
항목 | DRF | 일반 Django |
---|---|---|
직렬화 | ModelSerializer 자동 | 수동 JsonResponse 처리 |
인증/권한 | permission_classes 제공 | 직접 구현 필요 |
브라우저 테스트 | Browsable API 제공 | 없음 |
URL 관리 | ViewSet + Router 가능 | URL 별도 등록 |
✔️ 선택 기준
상황 | 추천 방식 |
---|---|
대규모 API 개발, 인증 필요 | ✅ DRF |
간단한 JSON 응답만 필요 | ✅ 일반 FBV |
✅ 정리
- DRF를 사용하면 관계형 데이터(Post-Comment-User)를 구조화된 JSON으로 쉽게 직렬화 가능
- FBV는 간단한 로직엔 가볍지만, 인증/보안/성능 측면에서 DRF보다 약함
- CSRF 토큰은 HTML 기반 View와 연동 시 필요하며, Serializer에서 동적으로 주입 가능
👉 다음 강의에서는 댓글 등록 및 Ajax와의 연동 방식을 다룹니다.